{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "452957\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "delta=0.05\n",
    "dvc=10\n",
    "\n",
    "def f(N):\n",
    "    return (8 / N * np.log(4 * ((2 * N) ** dvc + 1) / delta)) ** 0.5 - 0.05\n",
    "\n",
    "n = 1\n",
    "while(True):\n",
    "    if(f(n) <= 0):\n",
    "        break\n",
    "    else:\n",
    "        n += 1\n",
    "\n",
    "print(n)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "\n",
    "dvc = 50\n",
    "delta = 0.05\n",
    "\n",
    "#计算ln(m(N))\n",
    "def lm(n):\n",
    "    return dvc * np.log(n)\n",
    "\n",
    "#Original VC-bound\n",
    "def f1(n):\n",
    "    result = (8 / n) * (np.log(4 / delta) + lm(2 * n))\n",
    "    result = result ** 0.5\n",
    "    return result\n",
    "\n",
    "#Variant VC bound\n",
    "def f2(n):\n",
    "    result = (16 / n) * (np.log(2 / (delta ** 0.5)) + lm(n))\n",
    "    result = result ** 0.5\n",
    "    return result\n",
    "\n",
    "#Rademacher Penalty Bound\n",
    "def f3(n):\n",
    "    k1 = 2 * (np.log(2 * n) + lm(n)) / n\n",
    "    k2 = (2 / n) * np.log(1 / delta)\n",
    "    k3 = 1 / n\n",
    "    result = k1 ** 0.5 + k2 ** 0.5 + k3\n",
    "    return result\n",
    "\n",
    "#Parrondo and Van den Broek\n",
    "def f4(n):\n",
    "    k1 = 1 / n\n",
    "    k2 = 1 / (n ** 2) + (1 / n) * (np.log(6 / delta) + lm(2 * n))\n",
    "    k2 = k2 ** 0.5\n",
    "    result = k1 + k2\n",
    "    return result\n",
    "\n",
    "#Devroye\n",
    "def f5(n):\n",
    "    k1 = 1 / (n - 2)\n",
    "    k2 = (np.log(4 / delta) + lm(n * n)) / (2 * (n - 2)) + 1 / ((n - 2) ** 2)\n",
    "    k2 = k2 ** 0.5\n",
    "    result = k1 + k2\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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U+Jej4L3mTVrFp9++ikOh4N33nmHp59+mk8++QSpunRwTeEjh8PBH38oNbu7dOnC66+/TlpaGnPmzCE0NLTeY7/44ot8/PHHvPHGG84P/rp27UpNiYixY8c67ypzbsGlLl26sGDBAtLS0njooYfQ6XRA4wpR1aeh453bbn19bkjtIlagVBOMi4vj448/Zvz48Rftk6+vLwaDAaPRSPfu3dm8eTOyLLNt2za6devmLE5lMpnq1Fw5t89xcXEcOHAAk8nk/H66g+ePsEE5vU+jh33fQ8JQd/dGEC5JSEgII0eOZPHixdxwww3cd999REREYDAYOH36NE8++SR3330377zzjjPk5syZw7333suzzz5LUlISd9xxR73HnjBhAtdddx2xsbHYbDYsFgtvvPEGM2bMwGazMWrUKDp16lTve19//XVmzJhBeXk5w4YNq7fq36Vo7PHq67Ner6933ylTpji/lprqgRMnTsTHxweDwdBgX2qmRIxGI126dGH06NF069aNe++9F7PZzIQJE+jatStTpkxh6tSpxMfH07NnzwaP9+KLLzJ16lQiIiIa/OXZEjy3+NO5/vcn5S40fzkEKnXztCG0KqL4U+vz5Zdf8ve//53PPvvMWT/b27TO4k/n6jkBTHlwYoO7eyIIgpvcfffd7Nixw2vD+nJdMLAlSdJIknRSkqS06qVXS3XsPJ3GgNagTIsIgiC0QRcbYfcGFsqynFq9uPguppdA56eck71/CdgsbuuGIAiCu1wssAcDN0iStFWSpE8lSXLvh5R97wJLCRz+P7d2QxAEwR0uFtjbgGtkWb4C0ALXNX+XLiA5FQJjYPdXbu2GIAiCO1wssPfKspxT/Xg7cN75QZIkzZQkabskSdtrbrbZbFRq6HMnHPsNyrKbty1BuExz5851XgU4atQosrNb/md27ty5zkuv3dHGoEGDnOctL1269IL3iHRlu41VU6ArNTWV22+//bKLWC1YsIAFCxZc1jEu5GKB/V9JkvpIkqQGbgH2nLuDLMvzZVlOkWU5JSIiolk6WUffu5SSq3sWNn9bgnCZnnnmGdauXcs999zD+++/7+7utLhx48Y578K+evVqxo4d6+Yene/9998nLS2NkJAQfvnFs0s5X2xO+kXga0AClsqy7P5yY2EdIH4o7PoKrnwMqq8WE4QLOfPqq1gPurb4k0+3rkT9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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#### Problem 4\n",
    "#产生点集\n",
    "x = np.arange(100, 2000)\n",
    "\n",
    "y1 = [f1(i) for i in x]\n",
    "y2 = [f2(i) for i in x]\n",
    "y3 = [f3(i) for i in x]\n",
    "y4 = [f4(i) for i in x]\n",
    "y5 = [f5(i) for i in x]\n",
    "\n",
    "plt.plot(x, y1, label=\"Original VC-bound\")\n",
    "plt.plot(x, y2, label=\"Variant VC-bound\")\n",
    "plt.plot(x, y3, label=\"Rademacher Penalty Bound\")\n",
    "plt.plot(x, y4, label=\"Parrondo and Van den Broek\")\n",
    "plt.plot(x, y5, label=\"Devroye\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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gPeBeR0baK3XaK2TtdbJYWHdTtnXpcFhPnItuxBCdMJewX4CGGx5nQzYNC/fxRoS5kt6QRXdnR8QQoiB6IKDXSl1hVLqgQ6Lfw08oJTaCcwFrN/VYCcjI/2orGsit1wmRhBCiI5sDnat9TzL82at9csd3svRWn9Haz1La71Aa11p5zrbGRnlDxijPQrR361YsYIJEyaQnJzMa6+95uhyhBPod3eeAgyPMG6/Tc2r4PKR4Q6uRohL9/LLLzNq1CjGjx/PtGnTGDdunKNLEv1Y/wt2rQkwuRET6EVarhyxCztb/xjkHbbvOiPHwpLnu20WEhLCVVddxYcffsiqVasoLy/nmmuu4fHHH+fuu+/m/vvvZ8KECdxzzz3cddddhIWF8cQTT7QM0nXu1vvbb7+dsrIyJk+ezO9//3tuv/127rvvPqZPn86KFSu49957GTRoECtWrGi3DeE8+teQAqmfwPMJUH6WkZF+0hUjnE5ISAi//OUvWb58OV999RX/+te/KC4uZtmyZS3jtqSlpTFlyhQAPvnkE+65556W0R+fe+45brzxRrZv3055eTkbNmzgtttu469//SsNDQ2kpqYyffp0fvWrX523DeE8+tcRu3co1JdDQRojo+L58ttC6pvMeLq5Oroy4SxsOLLuSSUlJZjNZlavXs1bb71FdXU1OTk5zJ8/n9WrV5OamtpuMK2FCxcyffr0lp+PHTvGvffeCxgjJqampvLQQw+xatUqPv30U6691rjF5Pjx4+zatavdNkJCQnr3lxU9pn8Fe/hI47kwlRGRSTQ1a04WVDM62t+xdQlhB2VlZaxfv55FixaxatUqLr/8cv7yl78QHByMm5sbYWFhrFu3jmXLlrV8prNBqIYOHcru3bu56aabcHFxYcGCBTz66KMtw9KOGDGC6667rt02hPPoX10xXkHgGwkFaYyKNE6gHs+376QIQjjCgw8+yOLFi3nhhRd46623ePHFF5k1axYbNmwgIiICgO9+97u899577Y7QO3r88cd57733mD17NoGBgS1D4N5www3Ex8eTkJAAwGOPPWZ1G8I5dDsIWE+4lEHAeOc6qCun6YebGf3zz7hjViKPf0cGcBIXz9kHAdu0aRM//elPefbZZ1uGxBV936UMAta/umIAwkbB/rdxUzAswpdjuXLELkRX5s+fz759+xxdhuhF/asrBox+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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#比较y4, y5\n",
    "plt.plot(x, y4, label=\"Parrondo and Van den Broek\")\n",
    "plt.plot(x, y5, label=\"Devroye\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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VH78o5JSCqvZxGfmlfKZ2HwwwXCUPfVtfFzTwtYjrWytbeU/Xt9PJGr0ygsz7cwsyTaGOo7PZlZJFjku20h+DDEGjXiI/9OL29lx1Duk73nuuEy+d9V5/b7e1taGy+UCwOl04vUax9+0aRNf/epX+clPftLvvrt27aK0tJQXXniBRYsW8d///d/9brtv3z7eeOMNvv/97/OXv/yFBQsWcNddd3HppZeyatUq6uvrKSwsHNBnqqysZMuWLdTU1OB0OsnNzaW+vp75841rASZOnMjEiRO544472L17d2K/ZcuWATB//ny++93vcscdd/Diiy9isVjw+/1s3LiRxx9/nAceeIBp06b1eez333+f1157jaeffpoXXniBSZMmUV5ezvPPP8+XvvSlAbU/FdksJmaUZDGjJIsbK411vmCEHcda+fhIK1trWtha08qrO+sT+5S5ncwsyWJaUQZTizKYVpRJaY5D5lwXw2bEQ3wkZGZmJurHHR0dZGZmAjBjxgyuvfbaE+5bUlLC5s2bWbJkCV/72tdOuO3NN98MQFlZGcFgEKvVyq9+9Ssee+wxPB4PPp9vwG02m83MmzePBx54gMsuu6zX53jvvfd4/fXX+c///M9e+953331UVhopNHfuXPbv308kEkmsu/DCC3n++ee7hXhy2z73uc9htVopKyvjwIEDVFdXM3v2bIDEl8hY4bCZmVfuZl65O7Gu1Rfik9rWpB57C3/cdizxustm5pyiDCPYCzOYWmTU5KXXLobCiIf4iXrMw6WyspINGzZw1VVXsXHjRq655hoA0tPTT7rvunXruPfeexP7nEi8tx/3yCOPsHr1aq6//nouueSSU273qlWr+PKXv8zrr78OwKJFi1i7di133303r7/+Og6Ho999N2/ezMqVK9m6dSvLli0jLS2N559/ni9+8Yts2rSJ8847D5vNRm1tLQAvvfQSbre7z89RVlbGhx9+CMBHH33EhRdeeMqf5WyS5bCyaHIeiybnJda1B8LsrmuLLV521bXx0id1PP3ekcQ2BRl2psVOshrhnsHkgnSZK0ackhEP8ZHwla98hS984QssXLiQKVOmcN111w143zlz5nD55Zfz0EMPUVBQwHe+8x1mzJgxoH1XrFjBnXfeyS9/+UsAamtrmTBhwoCPvXLlStLT0xM96KuvvppXX32VhQsXkpeXx9NP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fft2vvKVr/DCCy+QkZFyf0QK0ctgTmy2A47Y8/RBvkdC3Q9/yKEv3DykS90Pf3jS4/7gBz9gyZIlbNq0ia997WscO3aMu+66i1dffZWDBw9SX18PwKZNm7jooosSAd7XuocffpgZM2bw+uuvM2XKFB599FEA9u3bxxtvvMG1117LX/7yF9auXcuVV17Ja6+9htVqPeG+PfXXvoEcoy+VlZVs2bKFmpoanE4nubm5Az5GX/o67tq1a5kxYwZvvPEGx44dY+vWrQN+PzAmKZs2bRpHjx7loosuGvDPvr/jHjt2jBtvvJGnn35aAlycNQYTwJuBxbHns4GDQ9aaMyheTnnqqafIysrCarXyq1/9ihtvvBGPx5OYdGnGjBlce+213fbtuW7Hjh1UVlYCcOGFF7Jz507AuDQduiZrik+oBTB//vwT7ttTf+0byDH6YjabmTdvHg888EBinpSBHqMvfR139+7dPP/881RVVXHgwIHE9LQDeT8wyik7duxgwYIF/OhHPwIG9rPv77g///nPKS0t5dChQ/0eU4hUM5grNp8A/qSUuhg4F3j3dBpQ9I//eDq7D5lHHnmE1atXc/3113PJJZck1vc16VTPdeeddx6bNm3i0ksvZdOmTZx33nkcPXq01xwl8Qm1li5dypYtW1i5cmWf+55K+wZyjP6sWrWKL3/5y7z++uundIy+9HXcqVOncsEFF3Drrbfyhz/8gbKyMt59991TmgvGZDKRk5OTmFlyID/7zs7OXsetr6/n3nvv5YorruC2226TGrs4awy4J661roo9HgJWAG8Bl2qtT//+X6PAihUruP/++1m2bBnASW9qkOyLX/wi27dvZ8mSJezdu7fXrczibr/9dp577jmqqqrwer2ntO9A29fXMfqzcuVK0tPTEz3Z0/kZ9HXcL33pS7z00kssWbKEX/7yl4wfP37A7wdGOWXRokW88sor/M3f/E2f2/T18+vvuGlpaYwfP55p06bxwgsvnFJbhBitZAIsIWLk91KMJgOdAEuu2BRCiBQmIS6EEClMQlwIIVKYhLgQQqQwCXEhhEhhYzLE16xZw/nnn8/8+fN5+OGHR7o5QggxaGP29mw///nPmT59OrNnz6aysjJxh3shhEglY7InHpebm8sVV1zB888/z+WXX87ChQu5//77AeNClS1btgBwxx138P7773Pw4EFu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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#### Problem 5\n",
    "x = np.arange(3, 11)\n",
    "y1 = [f1(i) for i in x]\n",
    "y2 = [f2(i) for i in x]\n",
    "y3 = [f3(i) for i in x]\n",
    "y4 = [f4(i) for i in x]\n",
    "y5 = [f5(i) for i in x]\n",
    "\n",
    "plt.plot(x, y1, label=\"Original VC-bound\")\n",
    "plt.plot(x, y2, label=\"Variant VC-bound\")\n",
    "plt.plot(x, y3, label=\"Rademacher Penalty Bound\")\n",
    "plt.plot(x, y4, label=\"Parrondo and Van den Broek\")\n",
    "plt.plot(x, y5, label=\"Devroye\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 17"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def data(n, p=0.2):\n",
    "    #产生20个随机数\n",
    "    X = np.random.uniform(-1, 1, size=(n))\n",
    "    #产生(X, y)，注意有p的误差\n",
    "    y = np.sign(X)\n",
    "    prob = np.random.uniform(0, 1, n)\n",
    "    y[prob < p] *= -1\n",
    "    return X, y\n",
    "\n",
    "#产生theta，注意这里只要取n个点相邻两点间的点n-1个点以及两侧的两个点即可\n",
    "def Theta(X):\n",
    "    theta = (X[1:] + X[:-1]) / 2\n",
    "    theta = np.r_[[X[0] - 1], theta]\n",
    "    theta = np.r_[theta, [X[-1] + 1]]\n",
    "    \n",
    "    #修改维度后范围\n",
    "    return theta.reshape(-1, 1)\n",
    "\n",
    "def decision_stump(X, y):\n",
    "    #排序\n",
    "    X1 = np.sort(X)\n",
    "    #计算theta\n",
    "    theta = Theta(X1)\n",
    "    #向量化执行计算\n",
    "    n = theta.shape[0]\n",
    "    m = X.shape[0]\n",
    "    #将X复制按横轴n份\n",
    "    X = np.tile(X, (n, 1))\n",
    "    #s=1\n",
    "    y1 = np.sign(X - theta)\n",
    "    #s=-1\n",
    "    y2 = np.sign(X - theta) * (-1)\n",
    "    #统计错误\n",
    "    error1 = np.sum(y1!=y, axis = 1)\n",
    "    error2 = np.sum(y2!=y, axis = 1)\n",
    "    #计算最小错误对应的下标\n",
    "    i1 = np.argmin(error1)\n",
    "    i2 = np.argmin(error2)\n",
    "    #判断哪个误差更小\n",
    "    if error1[i1] < error2[i2]:\n",
    "        s = 1\n",
    "        t = theta[i1][0]\n",
    "        error = error1[i1] / m\n",
    "    else:\n",
    "        s = -1\n",
    "        t = theta[i2][0]\n",
    "        error = error2[i2] / m\n",
    "    return s, t, error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "Ein = []\n",
    "Eout = []\n",
    "n = 20\n",
    "m = 5000\n",
    "for i in range(m):\n",
    "    X, y = data(n)\n",
    "    s, t, ein = decision_stump(X, y)\n",
    "    #计算eout\n",
    "    eout = 0.5 + 0.3 * s * (np.abs(t) - 1)\n",
    "    Ein.append(ein)\n",
    "    Eout.append(eout)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.16827999999999999\n"
     ]
    }
   ],
   "source": [
    "#Problem 17\n",
    "plt.hist(Ein)\n",
    "plt.title('Ein')\n",
    "plt.show()\n",
    "\n",
    "print(np.mean(Ein))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 18"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEFCAYAAAACFke6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAD3ZJREFUeJzt3X+s3Xddx/Hna+1maovQpTfFLZZmptEQt/LjUlfs4EK6hTGUZWpGRAkB0oQs/MM/jGyazDCYRBcnYdPi1GVGkg7CzznXEVfW4IDdimyLhsxIC1YqJZ1tanAqvv3jfkdvb297vvfsnnN293k+km/6Pe/zPd/v572zvc5n3+/3nKaqkCS9sJ036QFIkkbPsJekBhj2ktQAw16SGmDYS1IDDHtJaoBhryYleWeSHyY5Mm/5mUmPSxoVw14t+1xVvXTe8t2l7iDJK5JcO4rBScvJsJeem1cAhr2e9wx7qZPkvCR/kORwkm8meU1X/4sk75y3XXV/HgTuAK7vTgP9ziTGLfWxetIDkCborUmOdOtPAfcwN1P/WeC1wH1Jfu5sL66qzd2HwExVvXPEY5WeE8NeLftcVb3t2QdJPg18oqr+C/jbJMeBS+e/IEnGPEZpWXgaRzpdLVhf+EuBF49xLNKyMeylUx4A3p3kJ5K8HngJ8CRwAnj2tsz3LXjND4CXASTZMK6BSktl2Ktlb51/nz3wNPAE8C/AHwG/XlXPAJ8AfiPJ3wAHF+zjQeB4kn8HvjS+oUtLE3/PXpJe+JzZS1IDDHtJaoBhL0kNMOwlqQHPmy9VbdiwoTZv3jzpYUjSinLgwIEfVNXUoO2eN2G/efNmZmdnJz0MSVpRkhzqs52ncSSpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQHPm2/QPlebb7x/Isc9eNs1EzmuJC2FM3tJaoBhL0kNMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWqAYS9JDTDsJakBhr0kNcCwl6QG9Ar7JBcmuTLJhlEPSJK0/AaGfZL1wBeBbcDDSaaS3J3k0SQ3z9uuV02SNH59ZvaXAe+vqluBB4E3AquqajtwSZItSa7rUxtVE5Kkcxv4l5dU1ZcBkryOudn9hcCe7um9wA7glT1rT83fd5JdwC6ATZs2PYc2JEnn0vecfYDrgaeBAg53Tx0DNgJre9ZOU1W7q2q6qqanpqaG7UGSNECvsK85NwCPA68F1nRPrev2cbJnTZI0AX0u0H4gyTu6hy8BbmPulAzAVuAgcKBnTZI0AX3+wvHdwJ4k7wGeBD4LPJLkIuBq4HLmTu3s71GTJE1Anwu0TwNXzq8lmelqH62q40upSZLGr8/M/gzdB8CeYWqSpPHzoqkkNcCwl6QGGPaS1ADDXpIaYNhLUgMMe0lqgGEvSQ0w7CWpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWrAwLBP8uIkDyTZm+QzSS5I8p0k+7rl0m67W5I8luTj8157Rk2SNH59ZvZvB26vqquAI8CNwCeraqZbnkjyamAHsA34fpKdi9VG1IMkaYCBYV9Vd1bVQ93DKeB/gbck+XqSu5OsBl4PfLqqCngQuOIstdMk2ZVkNsns0aNHl6klSdJCvc/ZJ9kOrAceAnZW1TbgfODNwFrgcLfpMWDjWWqnqardVTVdVdNTU1NDNyFJOrfVfTZKciHwMeBXgSNV9Uz31CywBTgJrOlq65j7EFmsJkmagD4XaC8A7gM+WFWHgHuTbE2yCrgW+CZwgLnz8wBbgYNnqUmSJqDPzP7dwKuAm5LcBDwM3AsE+HxVfSnJecBHktwBvKlbDi1SkyRNwMCwr6q7gLsWlG9ZsM3/dXfbXAPcUVXfBlisJkkav17n7Puoqh8CnxpUkySNnxdNJakBhr0kNcCwl6QGGPaS1ADDXpIaYNhLUgMMe0lqgGEvSQ0w7CWpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWrAwLBP8uIkDyTZm+QzSS5IcneSR5PcPG+7XjVJ0vj1mdm/Hbi9qq4CjgBvA1ZV1XbgkiRbklzXpzaqJiRJ57Z60AZVdee8h1PAbwJ/2D3eC+wAXgns6VF7av6+k+wCdgFs2rRpqAYkSYP1PmefZDuwHvgucLgrHwM2Amt71k5TVburarqqpqempoZqQJI0WK+wT3Ih8DHgXcBJYE331LpuH31rkqQJ6HOB9gLgPuCDVXUIOMDcKRmArcDBJdQkSRMw8Jw98G7gVcBNSW4C/hz4rSQXAVcDlwMF7O9RkyRNwMCZfVXdVVXrq2qmW+4BZoCvAm+oquNVdaJPbVRNSJLOrc/M/gxV9TSn7rRZUk2SNH5eNJWkBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWqAYS9JDTDsJakBhr0kNcCwl6QGGPaS1ADDXpIaYNhLUgMMe0lqgGEvSQ0w7CWpAb3CPsnGJPu79YuT/GuSfd0y1dXvTvJokpvnve6MmiRp/AaGfZL1wD3A2q70i8CtVTXTLUeTXAesqqrtwCVJtixWG1UTkqRz6zOz/xFwPXCie3w58J4kf5/kw11tBtjTre8Fdpyldpoku5LMJpk9evToUA1IkgYbGPZVdaKqjs8rPcBckL8G2J7kMuZm/Ye7548BG89SW7jv3VU1XVXTU1NTQzchSTq31UO85u+q6hmAJN8AtgAngTXd8+uY+xBZrCZJmoBhAvjBJD+d5CeBq4AngQOcOk2zFTh4lpokaQKGmdnfAjwM/Dfwx1X1rSTfA/YnuQi4mrnz+rVITZI0Ab3Dvqpmuj8fBn5+wXMnkswAVwIfffYc/2I1SdL4DTOzX1RVPc2pu2/OWpMkjZ8XTSWpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWqAYS9JDTDsJakBhr0kNcCwl6QGGPaS1ADDXpIaYNhLUgN6hX2SjUn2d+vnJ/lCkq8keddSapKkyRgY9knWA/cAa7vS+4ADVfVLwK8ledESapKkCegzs/8RcD1wons8A+zp1h8BppdQO02SXUlmk8wePXp06aOXJPUyMOyr6kRVHZ9XWgsc7taPARuXUFu4791VNV1V01NTU8N1IEkaaJgLtCeBNd36um4ffWuSpAkYJoAPADu69a3AwSXUJEkTsHqI19wD/HWSK4CXA19j7nRNn5okaQJ6z+yraqb78xBwJfAVYGdV/ahvbbkHL0nqZ5iZPVX1b5y602ZJNUnS+HnRVJIaYNhLUgMMe0lqwFDn7HXK5hvvn8hxD952zUSOK2llcmYvSQ0w7CWpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWqAYS9JDTDsJakBhr0kNWDJYZ9kdZLvJNnXLZcmuSXJY0k+Pm+7M2qSpMkYZmZ/GfDJqpqpqhngAmAHsA34fpKdSV69sLZcA5YkLd3qIV5zOfCWJG8AngC+BXy6qirJg8DVwPFFal9auKMku4BdAJs2bRqyBUnSIMPM7B8DdlbVNuB8YA1wuHvuGLARWLtI7QxVtbuqpqtqempqaoihSJL6GGZm/3hVPdOtz3Iq8AHWMfcBcnKRmiRpQoYJ4XuTbE2yCriWuVn8ju65rcBB4MAiNUnShAwzs/9d4K+AAJ8HPgTsT3IH8KZuOQR8ZEFNkjQhSw77qnqSuTtyfqy72+Ya4I6q+vbZalo+m2+8f2LHPnjbNRM7tqThDDOzP0NV/RD41KCaJGkyvHAqSQ0w7CWpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1YFl+G0dtmdSPsPkDbNLwnNlLUgMMe0lqgGEvSQ0w7CWpAYa9JDXAsJekBnjrpVYM/95daXjO7CWpAYa9JDXAsJekBnjOXurBn4jQSjfysE9yN/By4P6q+tCojye9kEzyovSk+AE3GiMN+yTXAauqanuSP0uypaqeGuUxJa1sfsCNxqhn9jPAnm59L7AD+HHYJ9kF7OoenkzyredwrA3AD57D61cie26DPb/A5feA4Xt+WZ+NRh32a4HD3fox4FXzn6yq3cDu5ThQktmqml6Ofa0U9twGe27DqHse9d04J4E13fq6MRxPkrSIUYfvAeZO3QBsBQ6O+HiSpEWM+jTOZ4H9SS4CrgYuH+GxluV00Apjz22w5zaMtOdU1Sj3T5L1wJXAI1V1ZKQHkyQtauRhL0maPC+YvgAkuTDJlUk2THoskp6fVlTYJ7k7yaNJbj7L8y9O8kCSvUk+k+SCcY9xufXoeT3wRWAb8HCSqbEOcEQG9T1vu41JvjGucY1Sj/d6dZLvJNnXLZeOe4zLbQnv851Jfnlc4xqlHu/ze+e9x/+Q5E+W47grJuznfxsXuCTJlkU2eztwe1VdBRwB3jTOMS63nj1fBry/qm4FHmTBdxlWop59P+v3OXV774q1hPf6k1U10y1PjHeUy6vv+5zkCuClVfWFsQ5wBPr0XFV3PfseA/uBTyzHsVdM2LP4t3FPU1V3VtVD3cMp4PvjGdrIzDC45y9X1VeTvI652f2j4xveyMwwoG+AJG8E/pO5D/aVbobBPV8OvCXJ17vZ4Ur/IcMZBvSc5Hzmwu5gkreOb2gjM0OPf7cBklwMbKyq2eU48EoK+4Xfxt14tg2TbAfWV9VXxzGwEerVc5IA1wNPA/8znqGN1MC+u1N0vw3cOMZxjVKf9/oxYGdVbQPOB948prGNSp+e3wH8I/BRYFuS941pbKPSO8eAG4C7luvAKynse30bN8mFwMeAd41pXKPUq+eacwPwOPArYxrbKPXp+0bgzqr6j7GNarT69Px4VX2vW58FznV6ayXo0/Mrgd3dbdt/CbxhTGMblb45dh5zve5brgOvpLAf+G3cbrZ3H/DBqjo0vqGNTJ+eP5DkHd3DlwAvhPDr883rncANSfYBr0jyp+MZ2sj06fneJFuTrAKuBb45prGNSp+e/xm4pFufBlb6f9d9f1XgCuBrtZz3xlfViliAn2LuX+7bgX/q/kF9aME272XuVMa+brl+0uMeQ8/rgYeAR4A76b47sZKXPn0v2H7fpMc8pvf6F5j7v7cngFsnPeYx9fwi5iZwjzB3PeriSY971D13230YuG45j72ivlTV4rdxW+wZ2uzbnu15pMddSWEvSRrOSjpnL0kakmEvSQ0w7CWpAYa9JDXAsJekBvw/UDte1v1AcGIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.25585693682953115\n"
     ]
    }
   ],
   "source": [
    "#Problem 18\n",
    "plt.hist(Eout)\n",
    "plt.title('Eout')\n",
    "plt.show()\n",
    "\n",
    "print(np.mean(Eout))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 19"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def multi_decision_stump(X, y):\n",
    "    \"\"\"\n",
    "    对每个维度使用decision_stump\n",
    "    \"\"\"\n",
    "    n, m = X.shape\n",
    "    #初始化s, theta, d，最小错误为error\n",
    "    s = 1\n",
    "    t = 0\n",
    "    d = 0\n",
    "    error = 1\n",
    "    for i in range(m):\n",
    "        X1 = X[:, i]\n",
    "        s0, t0, error0 = decision_stump(X1, y)\n",
    "        if error0 < error:\n",
    "            error = error0\n",
    "            d = i\n",
    "            t = t0\n",
    "            s = s0\n",
    "    return s, t, d, error\n",
    "\n",
    "def preprocess(data):\n",
    "    X = data[:, :-1]\n",
    "    y = data[:, -1]\n",
    "    \n",
    "    return X, y "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-1 1.6175000000000002 3 0.24752475247524752\n"
     ]
    }
   ],
   "source": [
    "#读取数据\n",
    "data_train = np.genfromtxt(\"hw2_train.dat\")\n",
    "data_test = np.genfromtxt(\"hw2_test.dat\")\n",
    "\n",
    "#预处理数据\n",
    "X_train, y_train = preprocess(data_train)\n",
    "X_test, y_test = preprocess(data_test)\n",
    "\n",
    "#Problem 19\n",
    "s, theta, d, Ein = multi_decision_stump(X_train, y_train)\n",
    "print(s, theta, d, Ein)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Problem 20"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.355\n"
     ]
    }
   ],
   "source": [
    "#Problem 20\n",
    "n = X_test.shape[0]\n",
    "Eout = np.sum(s * np.sign(X_test[:, d] - theta) != y_test) / n\n",
    "print(Eout)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
